package main

import (
	"bufio"
	"fmt"
	"io"
	"os"
)

// PathExists 判断文件是否存在
func PathExists(path string) (bool, error) {
	_, err := os.Stat(path)
	if err == nil {
		// 文件或目录存在
		return true, nil
	}
	if os.IsNotExist(err) {
		return false, err
	}
	return false, nil
}

// CopyFile 复制资源方法
func CopyFile(dstFilePath string, srcFilePath string) (written int64, err error) {
	srcFile, errSrcFile := os.Open(srcFilePath)
	if errSrcFile != nil {
		fmt.Println(errSrcFile)
		return
	}
	defer srcFile.Close()
	// 通过缓存拿到reader
	reader := bufio.NewReader(srcFile)

	// 打开dstFilePath
	dstFile, errDstFile := os.OpenFile(dstFilePath, os.O_WRONLY|os.O_CREATE, 0666)
	if errDstFile != nil {
		fmt.Println(errDstFile)
		return
	}
	writer := bufio.NewWriter(dstFile) //注意这里时调用bufio.NewWriter()创建写操作
	defer dstFile.Close()

	return io.Copy(writer, reader)
}

func main() {
	/*// test 打开，关闭文件
	// 使用绝对路径打开
	file, err := os.Open("W:/Studybag/cae/GoLang/codes/src/go_code/chapter04/test.txt")
	if err != nil{
		fmt.Println("error：", err)
	}
	fmt.Printf("file:%v\n", file)
	defer file.Close()
	//errClose := file.Close()
	//if errClose != nil{
	//	fmt.Println("error：", errClose)
	//}

	// 创建一个 *Reader,是带缓冲的
	reader := bufio.NewReader(file)
	for {
		// 读到一个换行就就结束，(按行读取)
		str, err := reader.ReadString('\n')
		// io.EOF表示文件末尾
		if err == io.EOF{
			break
		}
		fmt.Printf(str)
	}

	// 一次性读取所有内容
	// 因为这种读取方式没有显式的Open文件，因此我们不需要Close文件
	// 因为文件的Open和Close被封装到ioutil.ReadFile函数内部
	content, errContent := ioutil.ReadFile("W:/Studybag/cae/GoLang/codes/src/go_code/chapter04/test.txt")
	if errContent != nil{
		fmt.Println("error：", errContent)
	}else{
		// 输出[]byte,强转string()输出原内容
		fmt.Println(string(content))
	}*/

	path := "W:/Studybag/cae/CodeBase/Go/gotesting/src/go_code/chapter04/test.txt"
	file, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0666)
	if err != nil {
		fmt.Println(err)
		return
	}
	defer file.Close()

	// 写入语句
	str := "hello world1213!\r\n"
	// 写入时使用带缓存的*Writer
	writer := bufio.NewWriter(file)
	for i := 0; i < 5; i++ {
		writer.WriteString(str)
	}
	// 因为writer是带缓存，因此在调用WriteString(str)方法时内容是写入到缓存中，所以
	// 这里需要到一个Flush方法，将缓冲的数据真正写入到文件中，否则文件中不会写入新数据
	writer.Flush()
	// 判断文件是否存在
	//fmt.Println(PathExists(path))

	//srcPath := "W:/Studybag/cae/GoLang/codes/src/go_code/chapter04/test.txt"
	//dstPath := "W:/Studybag/cae/GoLang/codes/src/go_code/chapter04/main/test1.txt"

	//CopyFile(dstPath, srcPath)
}
